
#ifndef GR
#define	GR

typedef struct gramaticaCDT * grADT;
typedef struct produccionCDT * prodADT;

/*	crea una abstraccion de gramatica
*/
grADT newGr(void);

/* 	devuelve una copia del nombre
	el usuario debe liberar memoria
*/
char * getGrNombre(grADT gr);

/*	hace una copia y guarda el nombre
	internamente
*/
void setGrNombre(grADT gr, char * str);

/*	libera memoria reservada
*/
void freeGr(grADT gr);

void setGrNum(grADT gr, int ea);

int getGrNum(grADT gr);


/* crea una abstraccion de produccion 
*/
prodADT newProd(void);

/* libera memoria
*/
void freeProd(prodADT prod);

/* agrega parte izquierda de la produccion
*/
void addProdIzq(prodADT prod, char * str);

/* agrega regla en parte derecha
*/
void addProdDer(prodADT prod, char * str);

/* establece que lo proximo a llegar en la parte
*  derecha sera otra derivación
*/
void setProdDerPipe(prodADT prod);

/* guarda copia de la produccion dentro de la gramática */
void saveGrProd(grADT gr,prodADT prod);

/* Imprime las producciones */
void printProds (grADT gr);

/* agrega un simbolo a los Simbolos No Terminales */
void addGrSNT(grADT gr, char c);

/* agrega un simbolo a los Simbolos Terminales */
void addGrST(grADT gr, char c);

/* devuelve la lista de SNT */
char * getGrSNT(grADT gr);

/* devuelve la lista de ST */
char * getGrST(grADT gr);

/* devuelve la lista de producciones */
char ** getGrProd(grADT gr);

#endif
